home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
edit
/
jwpsrc.zip
/
FILEIO.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-31
|
51KB
|
1,737 lines
/* Copyright (C) Stephen Chung, 1991-1993. All rights reserved. */
#include "jwp.h"
#include "idm.h"
#define HIGH_BIT_ESCAPE 0
#define MAXUNDOLEVELS 32000
static struct {
char *name;
} SupportedVersions[] = {
{ "B1" },
{ NULL }
};
static char filename[MAXFILENAMELEN];
static char filespec[MAXFILENAMELEN];
static OFSTRUCT of;
static FILE *Fp;
static FILEOPTIONS *filep;
static int FormatChoice;
static BOOL ConvertLineBreaks, AlignKanjis, OutputLineBreaks;
static int LineLength;
static long int FileLength, StatusSteps, CharRead;
static HWND statushwnd, statushwnd1;
static FILEFORMAT OriginalFormat;
static char *OverwriteMessage;
static BOOL HasText, InWord;
static int LineNumber;
static int BlankSpaces, CharPosition;
static int LastIndent, CurrentIndent, FirstIndent;
static int LastChar;
static BOOL LastTextIsKanji;
static BOOL SkipHighBitWarnings;
static int LevelsSaved = 0;
static POSITION p;
char *FileExtensions[] = {
".*",
".JWP",
".TPL",
".EUC",
".SJS",
".JIS",
".OLD",
".NEC",
NULL
};
char *FileFormatNames[] = {
"Auto-Detect",
"Normal",
"Template",
"EUC",
"Shift JIS",
"New JIS",
"Old JIS",
"NEC JIS",
NULL
};
BOOL FAR PASCAL FileOpenDlgProc (HWND, WORD, WORD, LONG);
BOOL FAR PASCAL FileSaveAsDlgProc (HWND, WORD, WORD, LONG);
extern BOOL FAR PASCAL FileFindProc (HWND, WORD, WORD, LONG);
static void MoveStatusBar (long int percent)
{
long int len;
char buffer[10];
HWND hwnd;
RECT rect;
HDC hdc;
if (statushwnd == NULL) return;
if (percent < 0L) return;
if (percent > 100L) percent = 100L;
sprintf(buffer, "%ld%%", percent);
SetDlgItemText(statushwnd, 4204, buffer);
hwnd = GetDlgItem(statushwnd, 4205);
GetClientRect(hwnd, &rect);
len = (rect.right - 4) * percent / 100L;
hdc = GetDC(hwnd);
SelectObject(hdc, GetStockObject(GRAY_BRUSH));
Rectangle(hdc, 2, 2, len + 2, rect.bottom - 2);
ReleaseDC(hwnd, hdc);
}
void NewParagraph (FILEOPTIONS *f, POSITION *pos, unsigned int n)
{
POSITION p = *pos;
PARAGRAPH far *pp;
ONELINE far *lp;
if (PARAOF(p) == NULL) {
PARAOF(p) = f->paragraph = f->eof = pp = StructAlloc(PARAGRAPH);
pp->prev = pp->next = NULL;
} else {
PARAOF(p)->next = f->eof = pp = StructAlloc(PARAGRAPH);
pp->prev = PARAOF(p);
pp->next = NULL;
PARAOF(p) = pp;
}
pp->leftindent = pp->firstindent = pp->rightindent = 0;
if (pp->prev != NULL) {
pp->spacing = pp->prev->spacing;
pp->spacemulti = pp->prev->spacemulti;
} else {
pp->spacing = f->basefont->spacing;
pp->spacemulti = 100;
}
n *= TEXTBLOCKSIZE;
pp->text = (UNIT far *) BlockAlloc(n * sizeof(UNIT));
pp->textsize = n;
pp->text[0].kanji = '\0';
LINEOF(p) = lp = pp->lines = pp->lastline = StructAlloc(ONELINE);
lp->next = lp->prev = NULL;
lp->position = 0;
lp->height = BASEFONT->height;
POSOF(p) = lp->length = 0;
f->nr_lines++;
LineNumber = 0;
*pos = p;
}
static void WriteNormalFile (FILE *fp, FILEOPTIONS *f, int saveundo)
{
int i, j, k;
UNIT far *cp;
PARAGRAPH far *pp;
FILEHEADER header;
FILEPARAHEADER pheader;
UNDOBUF far *up;
memset(&header, 0, sizeof(FILEHEADER));
memset(&pheader, 0, sizeof(FILEPARAHEADER));
header.magic = MAGIC;
strcpy(header.version, JWPFILEVERSION);
header.landscape = f->pagesetup.landscape ? 1 : 0;
header.paragraphs = 0;
header.lrheader = f->lrheader;
header.nofirstpage = f->nofirstpage;
for (i = 0; i < 4; i++) header.margins[i] = (float) f->pagesetup.margins[i];
for (i = 0; i < NRSUMMARIES && f->summary[i] == NULL; i++);
if (i < NRSUMMARIES) header.summary = TRUE;
for (j = 0; j < 4; j++) {
for (i = 0; i < NRHEADERS && f->header[j][i] == NULL; i++);
if (i < NRHEADERS) {
header.headers = TRUE;
break;
}
}
/* Undo's */
if (saveundo != 0) {
if (saveundo < 0) saveundo = f->undolevels;
for (i = 0, up = f->undo; up != NULL; up = up->next, i++);
f->undolevels = i;
if (saveundo > f->undolevels) saveundo = f->undolevels;
header.undo = saveundo;
} else {
header.undo = 0;
}
/* How many paragraphs? */
for (pp = f->paragraph; pp != NULL; pp = pp->next, header.paragraphs++);
fwrite (&header, sizeof(FILEHEADER), 1, fp);
/* Summaries */
if (header.summary) {
KANJI buffer[MAXLINELEN];
for (i = 0; i < NRSUMMARIES; i++) {
if (f->summary[i] == NULL) {
j = 0;
fwrite(&j, sizeof(int), 1, fp);
continue;
}
j = kanjilen(f->summary[i]) + 1;
if (j >= MAXLINELEN) j = MAXLINELEN - 1;
fwrite(&j, sizeof(int), 1, fp);
kanjicpy(buffer, f->summary[i]);
fwrite(buffer, sizeof(KANJI), j, fp);
}
}
/* Headers */
if (header.headers) {
KANJI buffer[MAXLINELEN];
for (k = 0; k < 4; k++) {
for (i = 0; i < NRHEADERS; i++) {
if (f->header[k][i] == NULL) {
j = 0;
fwrite(&j, sizeof(int), 1, fp);
continue;
}
j = kanjilen(f->header[k][i]) + 1;
if (j >= MAXLINELEN) j = MAXLINELEN - 1;
fwrite(&j, sizeof(int), 1, fp);
kanjicpy(buffer, f->header[k][i]);
fwrite(buffer, sizeof(KANJI), j, fp);
}
}
}
/* Undo's */
if (saveundo > 0) {
unsigned int len;
PARAGRAPH far *pp;
char buffer[MAXLINELEN];
for (i = 0, up = f->undo; i < saveundo && up != NULL; i++, up = up->next) {
_fmemcpy(buffer, up, sizeof(UNDOBUF));
fwrite(buffer, sizeof(UNDOBUF), 1, fp);
switch (up->action) {
case U_INSERT: break;
case U_DELETE:
case U_PARAFORMAT:
for (pp = (PARAGRAPH far *) up->data; pp != NULL; pp = pp->next) {
_fmemcpy(buffer, pp, sizeof(PARAGRAPH));
fwrite(buffer, sizeof(PARAGRAPH), 1, fp);
if (pp->text == NULL) {
len = 0;
fwrite(&len, sizeof(int), 1, fp);
} else {
len = unitlen(pp->text) + 1;
fwrite(&len, sizeof(int), 1, fp);
_fmemcpy(buffer, pp->text, len * sizeof(UNIT));
fwrite(buffer, sizeof(UNIT), len, fp);
}
}
break;
}
}
}
/* Output the file */
for (CharRead = 0L, pp = f->paragraph; pp != NULL; pp = pp->next) {
pheader.textsize = unitlen(pp->text) + 1;
pheader.spacemulti = pp->spacemulti;
pheader.firstindent = pp->firstindent;
pheader.leftindent = pp->leftindent;
pheader.rightindent = pp->rightindent;
fwrite(&pheader, sizeof(FILEPARAHEADER), 1, fp);
for (cp = pp->text; cp->kanji; cp++, CharRead++) {
if (CharRead % StatusSteps == 0)
MoveStatusBar(CharRead / StatusSteps);
if (ISKANJI(cp->kanji)) {
fputc(HIBYTE(cp->kanji) | 0x0080, fp);
fputc(LOBYTE(cp->kanji) | 0x0080, fp);
} else if (cp->kanji & 0x0080) {
fputc(HIGH_BIT_ESCAPE, fp);
fputc(cp->kanji & 0x007f, fp);
} else {
fputc(cp->kanji & 0x007f, fp);
}
}
fputc('\n', fp);
}
MoveStatusBar(100L);
}
static BOOL ReadNormalFile (FILE *fp, FILEOPTIONS *f, char * filename, HWND hwnd, BOOL template)